[CodeGenPrepare] Fix bad IR created by large offset GEP splitting. Creating the IR builder, then modifying the CFG, leads to an IRBuilder where the BB and insertion point are inconsistent, so new instructions have the wrong parent. Modified an existing test because the test wasn't covering anything useful (the "invoke" was not actually an invoke by the time we hit the code in question). Differential Revision: https://reviews.llvm.org/D55729 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@349693 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CodeGenPrepare.cpp b/lib/CodeGen/CodeGenPrepare.cpp index 392e8bc..c35f866 100644 --- a/lib/CodeGen/CodeGenPrepare.cpp +++ b/lib/CodeGen/CodeGenPrepare.cpp
@@ -5160,11 +5160,11 @@ } // Generate a new GEP to replace the current one. - IRBuilder<> Builder(GEP); + LLVMContext &Ctx = GEP->getContext(); Type *IntPtrTy = DL->getIntPtrType(GEP->getType()); Type *I8PtrTy = - Builder.getInt8PtrTy(GEP->getType()->getPointerAddressSpace()); - Type *I8Ty = Builder.getInt8Ty(); + Type::getInt8PtrTy(Ctx, GEP->getType()->getPointerAddressSpace()); + Type *I8Ty = Type::getInt8Ty(Ctx); if (!NewBaseGEP) { // Create a new base if we don't have one yet. Find the insertion @@ -5200,6 +5200,7 @@ NewGEPBases.insert(NewBaseGEP); } + IRBuilder<> Builder(GEP); Value *NewGEP = NewBaseGEP; if (Offset == BaseOffset) { if (GEP->getType() != I8PtrTy)
diff --git a/test/Transforms/CodeGenPrepare/AArch64/large-offset-gep.ll b/test/Transforms/CodeGenPrepare/AArch64/large-offset-gep.ll index 5cc00b7..005ea37 100644 --- a/test/Transforms/CodeGenPrepare/AArch64/large-offset-gep.ll +++ b/test/Transforms/CodeGenPrepare/AArch64/large-offset-gep.ll
@@ -88,18 +88,23 @@ } declare %struct_type* @foo() +declare void @foo2() define void @test4(i32 %n) personality i32 (...)* @__FrameHandler { ; CHECK-LABEL: test4 entry: - %struct = invoke %struct_type* @foo() to label %while_cond unwind label %cleanup + br label %while_cond while_cond: %phi = phi i32 [ 0, %entry ], [ %i, %while_body ] + %struct = invoke %struct_type* @foo() to label %while_cond_x unwind label %cleanup + +while_cond_x: ; CHECK: mov w{{[0-9]+}}, #40000 ; CHECK-NOT: mov w{{[0-9]+}}, #40004 %gep0 = getelementptr %struct_type, %struct_type* %struct, i64 0, i32 1 %gep1 = getelementptr %struct_type, %struct_type* %struct, i64 0, i32 2 + store i32 0, i32* %gep0 %cmp = icmp slt i32 %phi, %n br i1 %cmp, label %while_body, label %while_end @@ -114,8 +119,10 @@ ret void cleanup: - landingpad { i8*, i32 } cleanup - unreachable + %x10 = landingpad { i8*, i32 } + cleanup + call void @foo2() + resume { i8*, i32 } %x10 } declare i32 @__FrameHandler(...)